Projekt z zakresu analizy danych - wpływ rozkładu danych na MSE regresji
Wstęp i krótkie strzeszczenie projektu
SZUM LOSOWY TEN EPSILON NASZ GENERUJMY TEŻ ZA KAŻDYM RAZEM A NIE NA SZTYWNO TJ. PO USTALENIU TEGO SEEDA ABY TEŻ BYŁO TUTAJ TROCHE TEGO WPŁYWU ROZKŁADU NIE WIEM WSM CZY GLOBALNIE BEDZIE OKEJ? TO NAM ODBIERA JAKBY LOSOWSCI DALEJ, WIEC DODAJMY LOSOWANIE SZUMU DO SRODKA TYCH PETLI
Rozpatrujemy wpływ rozkładu zmiennych objaśniającyh na błąd średniokwadratowy (MSE) w następującym modelu regresji liniowej:
\[Y = 0.5 \ + \ X_1 \ + \ 0.6X_2^2 \ + \ \epsilon \]
gdzie \(X_1\) i \(X_2\) są zmiennymi losowymi pochodzącymi z rozkładów zależnych od rozpatrywanej sytuacji (patrz niżej), natomiast \(\epsilon\) jest szumem pochodzącym z rozkładu \(N(0,0.1)\) - jest tak, ponieważ chcemy się skupić wyłącznie na wpływie rozkładu predykatorów. MSE definiujemy następująco:
\[ MSE=\frac{1}{n} \sum_{i=1}^n(Y_i-\hat{Y_i})^2 \]
gdzie \(Y=(Y_1, Y_2, ..., Y_n)\) jest wektorem wartości obserwowanych, natomiast \(\hat{Y}=(Y_1, Y_2, ..., Y_n)\) jest wektorem wartości przewidywanych przez model, a \(n\) oznacza liczbę obserwacji w zbiorze danych. Dla całego projektu przyjmujemy, że \(n = 120\) , co pozwoli nam na bezpośrednie porównywanie uzyskiwanych wyników.
Lista rozpatrywanych przypadków
Poniżej przedstawiono wszystkie przypadki, w których generowane są zmienne losowe \(X_1\) i \(X_2\) . Opisano zarówno przypadki niezależne, jak i zależne, z uwzględnieniem możliwej zależności liniowej, nieliniowej tych zmiennych oraz wpływu zmiennej ukrytej na nie:
a) Zmienne niezależne
double_snorm
W tym przypadku zarówno \(X_1\) , jak i \(X_2\) pochodzą z rozkładu normalnego standaryzowanego: \(X_1\sim \mathcal{N}(0,1), \ X_2 \sim \mathcal{N}(0,1)\)double_unif_narrow
Zarówno \(X_1\) , jak i \(X_2\) są losowane z wąskiego rozkładu jednostajnego: \(X_1 \sim \mathrm{U}(-3,3), X_2 \sim \mathrm{U}(-3,3)\)double_unif_wide
W tym przypadku zmienne są losowane z szerszego rozkładu jednostajnego: \(X_1\sim \mathrm{U}(-5,5), X_2 \sim \mathrm{U}(-5,5)\)norm_exp
Zmienna \(X_1\) ma rozkład normalny z większym odchyleniem standardowym, a \(X_2\) pochodzi z rozkładu wykładniczego: \(X_1 \sim \mathcal{N}(0, 2.9), \quad X_2 \sim \mathrm{Exp}(\lambda = 1.2)\)snorm_exp
Tutaj \(X_1\) ma rozkład normalny standaryzowany, a \(X_2\) - wykładniczy: \(X_1 \sim \mathcal{N}(0,1), \quad X_2 \sim \mathrm{Exp}(\lambda = 1.2)\)pois_snorm
Zmienna \(X_1\) jest dyskretna z rozkładu Poisson’a, natomiast \(X_2\) ma rozkład normalny standaryzowany: \(X_1 \sim \mathrm{Pois}(\lambda = 2), \quad X_2 \sim \mathcal{N}(0,1)\)bimodal_snorm
W tym przypadku \(X_1\) ma rozkład bimodalny, a \(X_2\) - normalny standaryzowany: \(X_1 \sim 0.43\cdot \mathcal{N}(-3,0.8) + 0.57\cdot \mathcal{N}(3,0.8), \quad X_2 \sim \mathcal{N}(0,1)\)exp_norm
Zmienna \(X_1\) pochodzi z rozkładu wykładniczego, a \(X_2\) z normalnego: \(X_1 \sim \mathrm{Exp}(\lambda = 1.2), \quad X_2 \sim \mathcal{N}(0, 2.9)\)pois_norm
W tym przypadku \(X_1\) pochodzi z rozkładu Poisson’a, a \(X_2\) z rozkładu normalnego: \(X_1 \sim \mathrm{Pois}(\lambda = 2), \quad X_2 \sim \mathcal{N}(0, 2.9)\)t_snorm
Zmienna \(X_1\) pochodzi z rozkładu t-Studenta z 3 stopniami swobody, a \(X_2\) z rozkładu normalnego standaryzowanego: \(X_1 \sim t(df=3), \quad X_2 \sim \mathcal{N}(0,1)\)t_norm
Zmienna \(X_1\) pochodzi z rozkładu t-Studenta, a \(X_2\) z normalnego rozkładu o większej wariancji: \(X_1 \sim t(df=3), \quad X_2 \sim \mathcal{N}(0,2.9)\)t_exp
Zmienna \(X_1\) pochodzi z rozkładu t-Studenta, natomiast \(X_2\) z rozkładu wykładniczego: \(X_1 \sim t(df=3), \quad X_2 \sim \mathrm{Exp}(\lambda = 1.2)\)
b) Zmienne zależne
i) Zależność liniowa
- linear_corr_snorm
Obie zmienne pochodzą z rozkładu normalnego standaryzowanego, ale wprowadzona jest między nimi korelacja \(\rho\) : \((X_1, X_2) \sim \mathcal{N}\Big(\mu =\begin{pmatrix}0\\0\end{pmatrix},\Sigma =\begin{pmatrix}1 & \rho \\ \rho & 1\end{pmatrix}\Big)\)
Taki przypadek pozwala badać wpływ liniowej zależności między predykatorami
ii) Zależność nieliniowa
- nonlinear_corr
Zmienna \(X_2\) pochodzi z rozkładu normalnego standaryzowanego. Zmienna \(X_1\) jest nieliniową funkcją zmiennej \(X_2\) z dodatkiem szumu \(\eta\) : \(X_2 \sim \mathcal{N}(0,1), \quad X_1 = a \cdot e^{b X_2} + \eta, \quad \eta \sim \mathcal{N}(0,0.1)\)
Pozwala to na modelowanie przypadków, w których zależność między predykatorami jest wyraźnie nieliniowa
c) Zmienne zależne od zmiennej ukrytej Z
- hidden_impact
Tutaj zarówno \(X_1\) , jak i \(X_2\) zależą od wspólnej zmiennej ukrytej \(Z\) : \(X_1 = 2.7 Z + 12, \quad X_2 = 1.4 Z + 15, \quad Z \sim \mathcal{N}(0,1)\)
Taki przypadek umożliwia zbadanie wpływu zmiennej ukrytej na obserwowane zmienne objaśniające
Razem zbadamy 19 przypadków. Dla każdego z nich generować będziemy po 35 ramek danych, co da nam wystarczającą próbkę do porównywania wyników. Dla każdej z utworzonych ramek danych będziemy dopasowywać model regresji nieliniowej, zapiszemy uzyskane wyniki i porównamy je. Tym samym wyciągniemy najciekawsze informacje z wpływu różnych rozkładów predykatorów na wartość błędu średniokwadratowego tworzonej regresji.
1. Generowanie danych
Funkcja jako narzędzie
Wprowadzamy funkcję Y_true , która oblicza wartości wektora Y na podstawie wygenerowanych danych. W ten sposób tworzymy “prawdziwe, rzeczywiste” dane.
Następnie definiujemy globalny epsilon oraz eta , aby ustalić deterministyczne ich wartości i aby te wartości nie wpływały mocno na wartość Y, co pozwoli nam na lepsze bezpośrednie porównanie wpływu właśnie rozkładów predykatorów, a nie błędów na wytwarzany MSE.
Do generowania danych do każdego z wymienionych we wstępie przypadków rozkładu dannych zmiennych objaśniających wykorzystujemy funkcję generate_data . Uwzględnia ona wszystkie założenia rozpatrywanych przez nasz w tym projekcie scenariuszy. Generuje odpowiednie dane w zależności od wprowadzonego argumentu case (co tłumaczymy jako ‘przypadek’). Następnie wygenerowane dane są zapisywane do ramki danych, która zawiera 4 kolumny:
X1 - wartości pierwszej zmiennej objaśniającej
X2 - wartości drugiej zmiennej objaśniającej
Y - obliczone na podstawie wzoru (numer wzoru) wartości Y
Eps - losowy szum
Funkcja zwraca tę ramkę danych oraz meta dane generatora rozkładu, czyli listę parametrów użytych podczas generowania danych. Parametry te można poznać poniżej. A zatem wynik funkcji generate_data to lista posiadająca dwa elementy:
df- wygenerowana ramka danych zgodnie z wybranym przypadkiemcasemeta- meta dane przechowujące wartości parametrów użytych do generowania danych
Testowanie poprawności generowania zmiennych o określonych rozkładach
Sprawdźmy działanie naszych funkcji na poszczególnych przypadkach:
KAŻDY WYKRES NIECH MA JAKIŚ OPIS, TYTUŁ Z JAKIEGO ROZKLADU POCHODZĄ DANE I DLACZEGO WYGLĄDA TO TAK JAK WYGLĄDA I OPIS TEGO CO NA NICH WIDAĆ!!!
Krótka charakterystyka generowanych danych
Poniższa tabela zawiera empiryczne informacje co do wygenerowanych ramek danych. Pozwala to na porównanie poprawności otrzymywanych rozkładów.
TĄ TABELE ZROBIC DLA JEDNEJ PROBY PER ROZKLAD BO JEST ZA DLUGO I ODBIORA DOSTANIE OCZOPLĄSU ABY OGARNAC ALL, JEDEN WIERSZ PER ROZKLAD WYSTARCZY MOIM ZDANIEM I CZEMU TUTAJ MAMY KORELACJE XÓW MIEDZY SOBĄ? CO ONA NAM MÓWI W TEJ TABELI? - WYJASNIENIE JAKIES + WYRZUCIC WTEDY KOLUMNE RUN JESLI NIE UWZLEGINIAMY TYCH RUNÓW
| dist | run | mean_X1 | var_X1 | mean_X2 | var_X2 | cor_X1_X2 |
|---|---|---|---|---|---|---|
| double_snorm | 1 | -0.0944 | 1.0107 | 0.0366 | 0.9941 | 0.0207 |
| double_snorm | 2 | 0.1190 | 0.8789 | 0.0524 | 0.9250 | -0.0790 |
| double_snorm | 3 | 0.0086 | 1.1041 | 0.0679 | 0.9420 | -0.0244 |
| double_unif_narrow | 1 | -0.0218 | 3.1926 | 0.1894 | 2.6558 | -0.0464 |
| double_unif_narrow | 2 | 0.0856 | 3.0725 | -0.0182 | 3.0241 | -0.0682 |
| double_unif_narrow | 3 | -0.0222 | 2.7043 | -0.1443 | 3.1353 | 0.0570 |
| double_unif_wide | 1 | -0.2544 | 8.1735 | -0.1002 | 8.6854 | 0.0292 |
| double_unif_wide | 2 | 0.0902 | 8.4836 | -0.3130 | 9.0221 | -0.1144 |
| double_unif_wide | 3 | -0.0044 | 6.9755 | 0.1900 | 8.0864 | 0.1019 |
| norm_exp | 1 | -0.2835 | 10.8726 | 0.7690 | 0.6399 | 0.0924 |
| norm_exp | 2 | 0.1840 | 8.8237 | 0.7434 | 0.8405 | 0.0707 |
| norm_exp | 3 | -0.2861 | 9.9420 | 0.9623 | 1.0912 | -0.0210 |
| snorm_exp | 1 | -0.0110 | 0.9975 | 0.8148 | 0.7457 | -0.0555 |
| snorm_exp | 2 | 0.1006 | 1.0283 | 0.9087 | 1.1025 | -0.0462 |
| snorm_exp | 3 | -0.0012 | 0.7696 | 0.8585 | 0.6472 | -0.0435 |
| pois_snorm | 1 | 1.8750 | 1.9590 | -0.1502 | 1.0372 | 0.0356 |
| pois_snorm | 2 | 1.8500 | 1.7420 | -0.0383 | 1.1443 | -0.0707 |
| pois_snorm | 3 | 1.7667 | 1.8947 | 0.0535 | 1.0035 | 0.0100 |
| bimodal_snorm | 1 | 0.8252 | 7.7824 | -0.0026 | 0.8013 | 0.0049 |
| bimodal_snorm | 2 | 0.4680 | 9.3767 | 0.0951 | 0.8865 | 0.0217 |
| bimodal_snorm | 3 | 0.5746 | 9.9841 | -0.0404 | 0.8412 | 0.0832 |
| exp_norm | 1 | 0.9024 | 0.6992 | 0.3163 | 7.5213 | -0.1214 |
| exp_norm | 2 | 0.8451 | 0.7875 | -0.1668 | 8.2058 | -0.0691 |
| exp_norm | 3 | 0.8749 | 0.8768 | -0.2394 | 7.7229 | 0.0068 |
| pois_norm | 1 | 2.0167 | 1.9997 | -0.0012 | 7.6899 | 0.0603 |
| pois_norm | 2 | 2.2917 | 2.2083 | 0.1824 | 7.0601 | -0.1178 |
| pois_norm | 3 | 1.9583 | 2.3092 | 0.0251 | 8.2392 | -0.0989 |
| t_snorm | 1 | -0.0442 | 5.2564 | 0.1745 | 1.0444 | -0.0082 |
| t_snorm | 2 | 0.1973 | 1.7679 | -0.0999 | 0.9215 | 0.1823 |
| t_snorm | 3 | -0.1859 | 2.7905 | -0.0045 | 1.1585 | 0.0553 |
| t_norm | 1 | 0.0775 | 2.7976 | -0.2354 | 8.1891 | 0.1171 |
| t_norm | 2 | 0.2015 | 4.9488 | -0.4043 | 9.4272 | 0.0265 |
| t_norm | 3 | -0.2496 | 3.9975 | 0.1933 | 8.0795 | 0.0243 |
| t_exp | 1 | 0.0618 | 2.7471 | 0.8078 | 0.5647 | 0.1559 |
| t_exp | 2 | 0.1197 | 3.9914 | 0.6761 | 0.4367 | -0.2005 |
| t_exp | 3 | -0.2187 | 1.6797 | 0.7467 | 0.6327 | -0.0618 |
| linear_corr | 1 | 0.0016 | 0.9919 | -0.0012 | 0.9547 | 0.7929 |
| linear_corr | 2 | -0.1428 | 0.9773 | -0.1138 | 0.8182 | 0.7761 |
| linear_corr | 3 | 0.0789 | 1.0332 | -0.0017 | 1.0958 | 0.8335 |
| nonlinear_corr | 1 | 2.7863 | 26.9406 | 0.0649 | 0.8771 | 0.6809 |
| nonlinear_corr | 2 | 3.2443 | 42.5075 | 0.0282 | 1.1081 | 0.6716 |
| nonlinear_corr | 3 | 2.5868 | 21.5891 | -0.0078 | 0.9116 | 0.7165 |
| hidden_impact | 1 | 12.0693 | 6.8457 | 15.0359 | 1.8406 | 1.0000 |
| hidden_impact | 2 | 12.0783 | 6.5387 | 15.0406 | 1.7580 | 1.0000 |
| hidden_impact | 3 | 11.9339 | 6.3169 | 14.9657 | 1.6984 | 1.0000 |
To daje nam praktyczny wgląd na sposób generowania danych przez dedykowaną funkcję. Widzimy, że rozkłady się zgadzają z założeniami, a tworzone ramki danych są miarodajne. Możemy zatem przejść do dalszych badań.
Modele regresji dla róznych rozkładów danych i ich wpływ na MSE
!!!KRYTYCZNY BŁĄD DLACZEGO NIE MA SPLITU NA ZBIOR TESTOWY ABY TAM LICZYC MSE PRZECIEZ JAK FITUJEMY MODEL I LICZYMY MSE NA TYCH SAMYCH DANYCH TO BEDZIE OCZYWISTE ZE BEDZIE MALE BO MAMY OVERFITING!!! proponuje spli 80/20 ;)
+ W TEJ SEKCJI NIE TYKAMY NIC Z MOICH UKRYTYCH ZMIENNYCH JA TO ROBIE OSOBNO Z CAUSAL ML W MOJEJ SEKCJI
Dlaczego stosujemy modele liniowe lm()?
Model lm() w R implementuje klasyczną metodę najmniejszych kwadratów (MNK), która znajduje takie współczynniki \(\beta\), aby minimalizować sumę kwadratów błędów między wartościami obserwowanymi (Y) a wartościami przewidywanymi przez model \((\hat{Y})\).
Oznacza to, że lm() szuka prostych (hiperpłaszczyzn) najlepiej dopasowanych do danych w sensie średniokwadratowym (czyli właśnie tego, co mierzy MSE).
W naszym projekcie funkcja prawdziwa ma postać:
\[Y=0.5+X_1+0.6\cdot X_2^2+\epsilon\]To jest model liniowy względem parametrów, ponieważ zależność od \(\beta_0\), \(\beta_1\), \(\beta_2\) jest liniowa (nawet jeśli występuje kwadrat zmiennej \(X_2^2\)). Dlatego możemy używać lm() nawet mimo obecności nieliniowości w zmiennych.
Dlaczego trzy modele i jakie mają znaczenie?
Wybraliśmy trzy różne modele aby ocenić, jak różny stopień dopasowania modelu do prawdziwej zależności wpływa na wynik metryki MSE.
Każdy z modeli reprezentuje inny poziom trafności założeń:
CZYM JEST I(X2^2)W SENSIE TUTAJ TA LITERKA I przydałoby się wyjaśnienie
Model 1:
lm(Y ~ X1 + I(X2^2))odzwierciedla prawdziwą zależność i stanowi punkt odniesienia (najlepsze możliwe dopasowanie),Model 2:
lm(Y ~ X1 + X2)jest celowo uproszczony, aby pokazać, jak wzrasta błąd, gdy pominiemy ważny nieliniowy elementModel 3:
lm(Y ~ X1 + X2 + I(X1*X2))zawiera dodatkowy czynnik, który nie występuje w rzeczywistej funkcji - pokazuje, jak nadmiarowa złożoność wpływa na stabilność i wartość błędu. NIE BARDZO KUPUJE TEGO WYJAŚNIENIA TUTAJ
Globalny szum losowy \(\epsilon\)
Zmienna epsilon została zdefiniowana globalnie jako:
epsilon <- rnorm(120, sd = 0.1)
Stały szum globalny pozwala porównywać MSE między przypadkami, bo każdy model jest „testowany” w identycznych warunkach błędu losowego. Gdyby szum był generowany lokalnie w każdej ramce, to różnice w MSE mogłyby wynikać tylko z “losowego szczęścia” LOSOWE SZCZESCIE W PROJEKCIE STATYSTYCZNYM?? w generacji szumu, a nie z różnic między rozkładami czy modelami.
Wartość odchylenia standardowego = 0.1 została dobrana tak, żeby błąd nie dominował sygnału tj. żeby można było realnie zobaczyć różnice w dopasowaniu modeli, ale jednocześnie zachować element losowości.
UWAGI CO DO SAMEGO MSE, NIE JEST TO PORÓWNYWALNE TUTAJ BIORAC POD UWAGE SKALE ROZKLADOW I MOZE BYC WIEKSZE I NIE SWIADCZYC O TYM ZE JEST GORZEJ, TYLKO ZE MAMY BARDZIEJ ROZCHWIANY DATASET WIEC MOZNA NP. DODAAC WARIANCJE XÓW ALBO JE STANDARYZOWAĆ A TO JUŻ BYŁO NA WADZIE!
WIDZE ZMIENNA N_ITER USTAWIONA NA 200 A MIALO BYC W OPISIE PO 35 RAMEK A NIE 200, CZY JA CZEGOŚ NIE ROZUMIEM?
[1] "Przypadek: double_snorm"
[1] "Przypadek: double_unif_narrow"
[1] "Przypadek: double_unif_wide"
[1] "Przypadek: norm_exp"
[1] "Przypadek: snorm_exp"
[1] "Przypadek: pois_snorm"
[1] "Przypadek: bimodal_snorm"
[1] "Przypadek: exp_norm"
[1] "Przypadek: pois_norm"
[1] "Przypadek: t_snorm"
[1] "Przypadek: t_norm"
[1] "Przypadek: t_exp"
[1] "Przypadek: linear_corr_snormrho0.2"
[1] "Przypadek: linear_corr_snorm_rho0.5"
[1] "Przypadek: linear_corr_snorm_rho0.9"
[1] "Przypadek: nonlinear_corr_a0.5b0.2"
[1] "Przypadek: nonlinear_corr_a1b0.5"
[1] "Przypadek: nonlinear_corr_a1.5b1"
[1] "Przypadek: hidden_impact"
# A tibble: 57 × 9
case model min_MSE q25 mean_MSE median_MSE q75 max_MSE sd_MSE
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 bimodal_snorm ideal 0.00997 0.0105 0.0106 0.0107 0.0107 0.0108 1.63e-4
2 bimodal_snorm mixed 0.269 0.509 0.683 0.655 0.823 1.39 2.28e-1
3 bimodal_snorm simp… 0.270 0.533 0.710 0.682 0.859 1.45 2.42e-1
4 double_snorm ideal 0.00994 0.0105 0.0106 0.0106 0.0107 0.0108 1.51e-4
5 double_snorm mixed 0.287 0.513 0.655 0.639 0.755 1.58 2.11e-1
6 double_snorm simp… 0.288 0.528 0.677 0.659 0.778 1.59 2.16e-1
7 double_unif_… ideal 0.00989 0.0106 0.0106 0.0107 0.0107 0.0108 1.53e-4
8 double_unif_… mixed 1.73 2.33 2.51 2.51 2.69 3.24 2.68e-1
9 double_unif_… simp… 1.74 2.37 2.53 2.53 2.72 3.25 2.67e-1
10 double_unif_… ideal 0.00947 0.0105 0.0106 0.0106 0.0107 0.0108 1.99e-4
# ℹ 47 more rows
Zmienne ukryte - analia wpływu na model
Intuicja - przykład z Paryża
Pani Profesor Julie Josse na zimowej szkole z Causality i XAI w Srobonne University, przedstawiła problem zmiennych ukrytych w bardzo intuicyjny i zabawny sposób aby zrozumieć dlaczego jest to istotne i czemu same mlowe i statystyczne podejście może nas zawieść. Możemy np. dowieść statystycznie że spanie w butach powoduje ból głowy następnego dnia, i dowiodła to testem statystycznym z danych że ta korelacja jest istotna, lecz w danych nie mieliśmy informacji o tym że dana osoba spożyła spore ilości alkoholu przed który miał wpływ na jej upicie alkoholowe dzięki któremu po powrocie do domu z imprezy nie była w stanie zdjąć butów i poszła spać a rano obudziłą się z kacem, tego nam same dane nie powiedzą i potrzebujemy causal approach, posłużyłem się chatem gpt do wygenerowania poniższej grafiki w celu ilustracji abyśmy zrozumieli lepiej graf przyczynowo skutkowo korelacyjny (chat nie mógł zrozumieć prawidłowo kierunku strzałek więc zostawiam grafikę tak jak ja wygenerował :D)
Przechodząc do konkretnego przypadku naszego projektru w tym podrozdziale badamy przypadek, w którym nieobserwowana zmienna \(Z\) oddziałuje zarówno na zmienne \(X1, X2\)jak i na zmienną objaśnianą \(Y\) Taki układ powoduje:
zależność pomiędzy \(X1\) i \(X2\)
systematyczny składnik wpływający na \(Y\) którego nie potrafimy „wyjaśnić” przez posiadane zmienne z macierzy eksperymentu, tzw. bias przez pominięcie
potencjalnie złudną poprawę na danych uczących i gorszą generalizację.
Ponieważ \(Z\) nie jest w rozpatrywanej ramce danych, pokażemy, jak jego wpływ widoczny jest pośrednio: w strukturze predyktorów oraz w resztach modeli oraz w zmianie MSE.
Zbadajmy to jaki “cień” zostawiłą w naszych zmiennych \(X-owych\) nieznana zmienna \(Z\) za pomocą techniki PCA (analizy głównych składowych) a jak wiemy główną składową każdej z zmiennych \(X-owych\) jest ukryta i bardzo tajemnicza zmienna \(Z\)
Czy widać tak naprawdę wpływ zmiennej \(Z\) na zmienne \(X-owe\)?
| Zbiór | Corr(X1, X2) | Corr(PC1, X1) | Corr(PC1, X2) | PC1: udział wariancji |
|---|---|---|---|---|
| df1 | 1 | 1 | 1 | 100.0% |
| df2 | 1 | 1 | 1 | 100.0% |
| df3 | 1 | -1 | -1 | 100.0% |
Oczywiście że tak ponieważ w wariancie hidden_impact przyjęliśmy deterministyczne zależności. Skutkiem jest rząd macierzy cech równy 1, tj. \(X1\) i \(X2\) leżą na jednej prostej, co daje bardzo silne zależności, PC1 odtwarza kierunek \(Z\) z dokładnością do znaku. Jest to zamierzony, skrajny przykład confoundingu: cała zmienność predyktorów pochodzi ze wspólnej, nieobserwowanej przyczyny.
Wniosek z wykresu jest widoczny gołym okiem ponieważ 100% udziału wskazuje że cała zmienność zmiennych \(X1\) i \(X2\) leży w jednym kierunku. Co potwierdza wniosek z poprzedniej powyższej tabeli.
Dlaczego to ważne w kontekście causal approach?
Gdy PC1 wyjaśnia bardzo dużo wariancji, mamy silne przesłanki, że w danych działa nieobserwowany czynnik.
W takiej sytuacji modele regresji bez tego czynnika będą zostawiać strukturę w resztach (co pokazujemy w kolejnych wykresach) i będą miały podwyższony błąd generalizacji.
To uzasadnia, dlaczego w praktyce warto szukać proxy (zmiennych zastępczych) lub instrumentów żeby zredukować wpływ pominiętej zmiennej.
Waliadcja Krzyżowa modeli z ukrytą zmienną wpływową
Ustalmy dwie formy modelu którymi będziemy się posługiwać w dalszych rozważaniach
\[ Y \sim X1 + X2 \]
\[ Y \sim X1 + I(X_2^2) \]
| Zbiór | CV-MSE | CV-MSE | SE | SE | CI (low) | CI (low) | CI (hi) | CI (hi) | Δ (simple - ideal) | Rel. poprawa ideal vs simple |
|---|---|---|---|---|---|---|---|---|---|---|
| df1 | 3.1985 | 0.0111 | 1.5254 | 4e-04 | 0.2086 | 0.0104 | 6.1884 | 0.0119 | 3.1874 | 99.7% |
| df2 | 3.5222 | 0.0113 | 1.3184 | 4e-04 | 0.9381 | 0.0104 | 6.1063 | 0.0121 | 3.5109 | 99.7% |
| df3 | 1.9178 | 0.0113 | 0.5228 | 4e-04 | 0.8932 | 0.0105 | 2.9424 | 0.0121 | 1.9065 | 99.4% |
Gdzie:
CV_MSE_model - średni błąd walidacji krzyżowej (K-fold) danego modelu.
SE_model – błąd standardowy średniej CV-MSE (zmienność między foldami).
CI_low_model, CI_hi_model – dolna i górna granica 95% CI dla CV-MSE (≈ CV_MSE ± 1.96·SE).
Co z tego wynika dla causal approach?
Specyfikacja modelu ma pierwszorzędne znaczenie. Sama obecność nieobserwowanej \(Z\) nie musi niszczyć jakości predykcji, jeśli informacja o \(Z\) jest „pośrednio zakodowana” w \(X\) i uchwycona właściwą postacią
Brak właściwej postaci ma wpływ duży koszt generalizacji.
simpletraci nie dlatego, że nie widzi \(Z\), tylko dlatego, że źle modeluje zależność \(Y\) do \(X\).
Podsumowanie sekcji zmiennych ukrytych
Konkluzja. W naszym skrajnym scenariuszu hidden_impact dominująca struktura w \(X\) (PC1 ≈ cień \(Z\)) oraz CV-MSE pokazują, że kluczowa jest prawidłowa postać funkcjonalna względem obserwowalnych cech; dopiero gdy po jej uwzględnieniu reszty nadal są skorelowane z proxy-Z i CV-MSE pozostaje wysokie, sensowne jest inwestowanie w dodatkowe zmienne/proxy/instrumenty.